package javase2.day07;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;

/**
 * 反射API
 *    反射API 是Java的管理机制，是Java与生俱来的API
 *     名词一定是类型
 *     “类型是名词”，java有一个类“java.lang.Class"
 *     任何类型都是Class的实例，也就是“一个类”是Class实例
 *     如：String 就是Class实例
 *           Class cls = String.class;
 *           System.out.println(cls.getName());
 *           Class intCls = int.class;
 *           System.out.println(intCls.getName()); int 
 *      
 * 
 * 发现对象的类型
 * 发现类型的属性，方法，构造器等
 * 调用某类型构造器创建对象
 *调用某对象方法
 *访问某对象属性
 */
public class Demo3 {
	public static void main(String[] args){
		discover("abc");
		discover(1);
		Object obj = new Cat();
		discover(obj);
		discover("abc");
		Cat cat = new Cat();
		//cat.
	}
	/**
	 *  * 发现对象的类型
 * 发现类型的属性，方法，构造器等
	 * @param obj 某对象
	 */
	public static void discover(Object obj){
		Class cls = obj.getClass();  //获取对象的类型
		System.out.println(cls.getName()); //获取类型的名字
		System.out.println("发现类型的属性:");
		Field[] fields = cls.getDeclaredFields();
		for(Field field :fields){
			System.out.println(field.getType()+" "+field.getName());
		}
		System.out.println("发现类型的方法:");
		Method[] methods = cls.getDeclaredMethods();
		for(Method method : methods){
			System.out.println(method.getReturnType()+","+method.getName()+","+Arrays.toString(method.getParameterTypes()));
		}
		System.out.println("发现构造器:");
		Constructor[] constructors = cls.getDeclaredConstructors();
		for(Constructor c:constructors){
			System.out.println(c.getName()+Arrays.toString(c.getParameterTypes()));
		}
	}
}
class Cat{
	String name = "Tom";
	String sex = "Man";
	
	public String getName(){
		return name;
	}
	public void setSex(String sex){
		this.sex=sex;
	}
}
